#include "fs/file.h"
#include "ipc/mutex.h"
#include "tools/klib.h"

static file_t file_table[FILE_TABLE_SIZE];
static mutex_t file_table_mutex;

file_t * file_alloc(void)
{
    file_t * file = 0;
    mutex_lock(&file_table_mutex);
    for(int i=0;i<FILE_TABLE_SIZE;i++)
    {
        file_t * f = file_table + i;
        if(f->ref == 0)
        {
            kernel_memset((void *)f, 0, sizeof(file_t));
            f->ref = 1;
            file = f;
            break;
        }
    }
    mutex_unlock(&file_table_mutex);
    return file;
}

void file_free(file_t * file)
{
    mutex_lock(&file_table_mutex);
    if(file->ref)
    {
        file->ref--;
    }
    mutex_unlock(&file_table_mutex);
}

void file_tabel_init(void)
{
    mutex_init(&file_table_mutex);
    kernel_memset((void *)file_table, 0, sizeof(file_table));
}

void file_inc_ref(file_t * file)
{
    mutex_lock(&file_table_mutex);
    if(file->ref)
    {
        file->ref++;
    }
    mutex_unlock(&file_table_mutex);
}